/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package springinyeccion;

import modelo.Impresora;
import modelo.ImpresoraUnica;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *
 * @author odeen
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ApplicationContext aplicacion = new ClassPathXmlApplicationContext("scope.xml");
        /*
         * Obtenemos dos veces la misma impresora, puesto que es de visibilidad singleton
         */
        System.out.println("Obtenemos dos veces la misma impresora, puesto que es de visibilidad singleton");
        Impresora impresora = (Impresora) aplicacion.getBean("impresora_singleton");
        impresora.imprimir();
        Impresora impresora2 = (Impresora) aplicacion.getBean("impresora_singleton");
        impresora2.imprimir();
        /*
         * Obtenemos dos impresoras, puesto que es de visibilidad prototype
         */
        System.out.println("Obtenemos dos impresoras, puesto que es de visibilidad prototype");
        Impresora impresora3 = (Impresora) aplicacion.getBean("impresora_prototype");
        impresora3.imprimir();
        Impresora impresora4 = (Impresora) aplicacion.getBean("impresora_prototype");
        impresora4.imprimir();

        /*
         * Hay que tener en cuenta que singleton sólo garantiza una única
         * instancia dentro del contendor de Spring, no dentro de la máquina virtual:
         */
        System.out.println("Hay que tener en cuenta que singleton sólo garantiza una única instancia dentro del contendor de Spring, no dentro de la máquina virtual");
        Impresora impresoraDirecta = new Impresora();
        impresoraDirecta.imprimir();
        /*
         * para evitarlo necesitamos un método estático de construcción en la
         * propia clase, ver la clase ImpresoraÚnica
         */
        System.out.println("Ahora tenemos la garantía de que sólo hay una instancia");
        ImpresoraUnica impresoraÚnica = (ImpresoraUnica) aplicacion.getBean("impresoraÚnica");
        impresoraÚnica.imprimir();
        ImpresoraUnica impresoraÚnica2 = (ImpresoraUnica) aplicacion.getBean("impresoraÚnica");
        impresoraÚnica2.imprimir();
        // ImpresoraÚnica impresoraÚnica3 = new ImpresoraÚnica(); //Imposible por el constructor privado
        ImpresoraUnica impresoraÚnica3 = ImpresoraUnica.getImpresora();
        impresoraÚnica3.imprimir();


    }
}
